/*
观察某个对象的所有属性
@param {Object} obj
1.对对象继续监听
2.修改时--->函数 谁在动这个也就是依赖性
*/
function observer(obj) {
    for (let i in obj) {
        let internalValue = obj[i]
        let fncs = []//new set
        Object.defineProperty(obj, i, {
            get() {
                // 监听
                if (window.__sjc && !fncs.includes(window.__sjc)) {
                    fncs.push(window.__sjc)
                }
                return internalValue
            },
            set(val) {
                internalValue = val
                // 更新派发
                fncs.forEach(fn => fn())
            }
        })
    }
}
// 通过全局对象windo.__sjc的方式知道了我们每一次执行的函数是谁
function autorun(fn) {
    window.__sjc = fn
    fn();
    window.__sjc = null
}